//package com.holyant.report.dto;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.TypeReference;
//import com.ruoyi.common.core.utils.StringUtils;
//import com.fkmalls.sales.api.emuns.OrderChannelEnum;
//import com.fkmalls.stock.api.enums.InoutBillTypeEnum;
//import lombok.AllArgsConstructor;
//import lombok.Builder;
//import lombok.Data;
//import lombok.NoArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.util.CollectionUtils;
//
//import java.math.BigDecimal;
//import java.util.Arrays;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//import java.util.stream.Collectors;
//
//
///**
// * 进销存结转统计-本期出库数量明细json
// *
// * @author zgx *
// * @date 2024年03月19日 14:13
// */
//@Slf4j
//@Data
//@Builder
//@AllArgsConstructor
//@NoArgsConstructor
//public class RptInventoryOutDataDto {
//
//    /**
//     * C2P 销售出库数量
//     */
//    private BigDecimal salesOutC2pQty;
//
//
//    /**
//     * POP 销售出库数量
//     */
//    private BigDecimal salesOutPopQty;
//
//
//    /**
//     * B2B 销售出库数量
//     */
//    private BigDecimal salesOutB2bQty;
//
//    /**
//     * KA 销售出库数量
//     */
//    private BigDecimal salesOutKaQty;
//
//    /**
//     * WM 销售出库数量
//     */
//    private BigDecimal salesOutWmQty;
//
//    /**
//     * 调整出库数
//     */
//    private BigDecimal adjustOutQty;
//
//
//    /**
//     * 其他出库数
//     */
//    private BigDecimal otherQty;
//
//
//    public static RptInventoryOutDataDto convertRptInventoryOutDataDto(List<RptInventoryInOutQtyDto> inventorys) {
//        RptInventoryOutDataDto inventoryOutDataDto = new RptInventoryOutDataDto();
//
//
//        List<RptInventoryInOutQtyDto> channelOutLists = inventorys.stream().filter(item -> StringUtils.isNotEmpty(item.getChannel()))
//                .filter(item -> item.getBillType().equals(InoutBillTypeEnum.SALE_OUT.getCode()))
//                .collect(Collectors.toList());
//
//        // 设置销售出库数量
//        if (CollectionUtils.isEmpty(channelOutLists)) {
//            inventoryOutDataDto.setSalesOutC2pQty(BigDecimal.ZERO);
//            inventoryOutDataDto.setSalesOutPopQty(BigDecimal.ZERO);
//            inventoryOutDataDto.setSalesOutB2bQty(BigDecimal.ZERO);
//            inventoryOutDataDto.setSalesOutKaQty(BigDecimal.ZERO);
//            inventoryOutDataDto.setSalesOutWmQty(BigDecimal.ZERO);
//        } else {
//            Map<String, List<RptInventoryInOutQtyDto>> channelMaps = channelOutLists.stream().collect(Collectors.groupingBy(RptInventoryInOutQtyDto::getChannel));
//
//            List<RptInventoryInOutQtyDto> c2pLists = channelMaps.get(OrderChannelEnum.C2P.getCode());
//            List<RptInventoryInOutQtyDto> popLists = channelMaps.get(OrderChannelEnum.POP.getCode());
//            List<RptInventoryInOutQtyDto> b2bLists = channelMaps.get(OrderChannelEnum.B2B.getCode());
//            List<RptInventoryInOutQtyDto> kaLists = channelMaps.get(OrderChannelEnum.KA.getCode());
//            List<RptInventoryInOutQtyDto> wmLists = channelMaps.get(OrderChannelEnum.WM.getCode());
//
//            inventoryOutDataDto.setSalesOutC2pQty((CollectionUtils.isEmpty(c2pLists) ? BigDecimal.ZERO : c2pLists.stream().map(RptInventoryInOutQtyDto::getQty).reduce(BigDecimal::add).get()));
//            inventoryOutDataDto.setSalesOutPopQty((CollectionUtils.isEmpty(popLists) ? BigDecimal.ZERO : popLists.stream().map(RptInventoryInOutQtyDto::getQty).reduce(BigDecimal::add).get()));
//            inventoryOutDataDto.setSalesOutB2bQty((CollectionUtils.isEmpty(b2bLists) ? BigDecimal.ZERO : b2bLists.stream().map(RptInventoryInOutQtyDto::getQty).reduce(BigDecimal::add).get()));
//            inventoryOutDataDto.setSalesOutKaQty((CollectionUtils.isEmpty(kaLists) ? BigDecimal.ZERO : kaLists.stream().map(RptInventoryInOutQtyDto::getQty).reduce(BigDecimal::add).get()));
//            inventoryOutDataDto.setSalesOutWmQty((CollectionUtils.isEmpty(wmLists) ? BigDecimal.ZERO : wmLists.stream().map(RptInventoryInOutQtyDto::getQty).reduce(BigDecimal::add).get()));
//        }
//
//        List<RptInventoryInOutQtyDto> adjustLists = inventorys.stream().filter(item -> Objects.nonNull(item.getBillType()))
//                .filter(item -> item.getBillType().equals(InoutBillTypeEnum.ADJUST_OUT.getCode()))
//                .collect(Collectors.toList());
//
//        // 设置调整入库数量
//        inventoryOutDataDto.setAdjustOutQty((
//                        CollectionUtils.isEmpty(adjustLists) ? BigDecimal.ZERO
//                                : adjustLists.stream().map(RptInventoryInOutQtyDto::getQty).reduce(BigDecimal::add).get()
//                )
//        );
//
//
//        List<RptInventoryInOutQtyDto> otherLists = inventorys.stream().filter(item -> Objects.nonNull(item.getBillType()))
//                .filter(item -> !item.getBillType().equals(InoutBillTypeEnum.SALE_OUT.getCode()))
//                .filter(item -> !item.getBillType().equals(InoutBillTypeEnum.ADJUST_OUT.getCode()))
//                .collect(Collectors.toList());
//
//
//        // 设置其他入库数量
//        inventoryOutDataDto.setOtherQty((
//                        CollectionUtils.isEmpty(otherLists) ? BigDecimal.ZERO
//                                : otherLists.stream().map(RptInventoryInOutQtyDto::getQty).reduce(BigDecimal::add).get()
//                )
//        );
//
//
//        return inventoryOutDataDto;
//    }
//
//
//    public static RptInventoryOutDataDto mergeOutDataDto(RptInventoryOutDataDto sourceData, String outData1) {
//        RptInventoryOutDataDto inventoryOutDataDto = new RptInventoryOutDataDto();
//        List<RptInventoryOutDataDto> rptInventoryInDataDtos = Arrays.asList(Objects.isNull(sourceData) ? initOutDto() : sourceData, convertOutDataDto(outData1));
//
//        inventoryOutDataDto.setSalesOutC2pQty(rptInventoryInDataDtos.stream().map(RptInventoryOutDataDto::getSalesOutC2pQty).reduce(BigDecimal::add).get());
//        inventoryOutDataDto.setSalesOutPopQty(rptInventoryInDataDtos.stream().map(RptInventoryOutDataDto::getSalesOutPopQty).reduce(BigDecimal::add).get());
//        inventoryOutDataDto.setSalesOutB2bQty(rptInventoryInDataDtos.stream().map(RptInventoryOutDataDto::getSalesOutB2bQty).reduce(BigDecimal::add).get());
//        inventoryOutDataDto.setSalesOutKaQty(rptInventoryInDataDtos.stream().map(RptInventoryOutDataDto::getSalesOutKaQty).reduce(BigDecimal::add).get());
//        inventoryOutDataDto.setSalesOutWmQty(rptInventoryInDataDtos.stream().map(RptInventoryOutDataDto::getSalesOutWmQty).reduce(BigDecimal::add).get());
//        inventoryOutDataDto.setAdjustOutQty(rptInventoryInDataDtos.stream().map(RptInventoryOutDataDto::getAdjustOutQty).reduce(BigDecimal::add).get());
//        inventoryOutDataDto.setOtherQty(rptInventoryInDataDtos.stream().map(RptInventoryOutDataDto::getOtherQty).reduce(BigDecimal::add).get());
//        return inventoryOutDataDto;
//    }
//
//
//    public static RptInventoryOutDataDto convertOutDataDto(String outData) {
//        if (StringUtils.isEmpty(outData)) {
//            return initOutDto();
//        }
//
//        if (outData.equals("[]")) {
//            return initOutDto();
//        }
//
//        try {
//            return JSON.parseObject(outData, new TypeReference<RptInventoryOutDataDto>() {
//            });
//        }catch (Exception e){
//            log.error(e.getMessage(),e);
//        }
//        return initOutDto();
//    }
//
//
//    private static RptInventoryOutDataDto initOutDto() {
//        RptInventoryOutDataDto outDataDto = new RptInventoryOutDataDto();
//        outDataDto.setSalesOutC2pQty(BigDecimal.ZERO);
//        outDataDto.setSalesOutPopQty(BigDecimal.ZERO);
//        outDataDto.setSalesOutB2bQty(BigDecimal.ZERO);
//        outDataDto.setSalesOutKaQty(BigDecimal.ZERO);
//        outDataDto.setSalesOutWmQty(BigDecimal.ZERO);
//        outDataDto.setAdjustOutQty(BigDecimal.ZERO);
//        outDataDto.setOtherQty(BigDecimal.ZERO);
//        return outDataDto;
//    }
//
//}
